#include <bits/stdc++.h>
using namespace std;

int n, s, a[10010];
int x[101][101];  // x[i][j]表示第i个选项在第j个维度上的值
int d[101], top, maxn;  // d存储当前选择的选项，top是当前数量，maxn是目前找到的最小数量
int best[101];  // 存储最优解
vector<int> m[10010];  // 存储当前选择在各维度上的总和

// cur表示当前选择的数量
void dfs(int cur) {
    // 如果当前选择数量已经不少于已知最优解，提前剪枝
    if (cur >= maxn) return;
    
    // 检查是否满足所有条件
    bool satisfied = true;
    for (int j = 1; j <= n; j++) {
        if (m[j].back() < a[j]) {
            satisfied = false;
            break;
        }
    }
    
    // 如果满足条件，更新最优解
    if (satisfied) {
        maxn = cur;
        memcpy(best, d, sizeof(int) * (cur + 1));
        return;
    }
    
    // 尝试选择下一个选项
    for (int i = 1; i <= s; i++) {
        // 避免重复选择同一个选项
        bool used = false;
        for (int j = 1; j <= cur; j++) {
            if (d[j] == i) {
                used = true;
                break;
            }
        }
        if (used) continue;
        
        // 选择第i个选项
        d[++top] = i;
        for (int j = 1; j <= n; j++) {
            m[j].push_back(m[j].back() + x[i][j]);
        }
        
        // 递归搜索
        dfs(cur + 1);
        
        // 回溯
        top--;
        for (int j = 1; j <= n; j++) {
            m[j].pop_back();
        }
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        m[i].push_back(0);  // 初始值为0
    }
    
    cin >> s;
    for (int i = 1; i <= s; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> x[i][j];
        }
    }
    
    // 初始化最大值为一个较大的数
    maxn = s + 1;
    top = 0;
    dfs(0);
    
    // 输出结果
    if (maxn <= s) {
        cout << "最小选择数: " << maxn << endl;
        cout << "选择的选项: ";
        for (int i = 1; i <= maxn; i++) {
            cout << best[i] << " ";
        }
        cout << endl;
    } else {
        cout << "没有找到满足条件的组合" << endl;
    }
    
    return 0;
}